#include "mainwindow.h"

#include <QApplication>
#include <QDebug>
#include <QDateTime>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QIODevice>
#include <QStandardPaths>
#include <QMessageBox>
#include <QProcessEnvironment>

// 简单的日志函数
void logToFile(const QString &message) {
    // 使用标准目录存储日志文件，避免硬编码绝对路径
    QString logDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
    if (logDir.isEmpty()) {
        logDir = QDir::currentPath();
    }
    
    QDir().mkpath(logDir);  // 确保目录存在
    QString logFilePath = logDir + "/oa_startup.log";
    
    QFile file(logFilePath);
    if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
        QTextStream out(&file);
        out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << " - " << message << "\n";
        file.close();
    } else {
        // 如果无法写入文件，则不输出任何内容到控制台
        // qDebug() << "无法打开日志文件:" << logFilePath << "错误:" << file.errorString();
    }
}

// 检查运行环境
bool checkEnvironment() {
    // 检查工作目录
    QString currentDir = QDir::currentPath();
    logToFile(QString("当前工作目录: %1").arg(currentDir));
    // qDebug() << "当前工作目录:" << currentDir;
    
    // 检查必要的文件
    QStringList requiredFiles = {"toy_factory.db", "Resources.qrc"};
    for (const QString &fileName : requiredFiles) {
        if (!QFile::exists(fileName)) {
            logToFile(QString("警告: 文件不存在: %1").arg(fileName));
            // qDebug() << "警告: 文件不存在:" << fileName;
        } else {
            logToFile(QString("文件存在: %1").arg(fileName));
            // qDebug() << "文件存在:" << fileName;
        }
    }
    
    // 检查环境变量
    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
    if (env.contains("PATH")) {
        logToFile("PATH 环境变量存在");
        // qDebug() << "PATH 环境变量存在";
    } else {
        logToFile("警告: PATH 环境变量不存在");
        // qDebug() << "警告: PATH 环境变量不存在";
    }
    
    return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 记录程序启动
    logToFile(QString("程序启动 - Qt版本: %1").arg(QT_VERSION_STR));
    
    // 检查运行环境
    if (!checkEnvironment()) {
        QMessageBox::critical(nullptr, "环境检查失败", "程序运行环境检查失败，请检查安装是否完整。");
        return -1;
    }
    
    // 设置应用程序属性
    a.setApplicationName("玩具工厂管理系统");
    a.setApplicationVersion("1.0");
    a.setOrganizationName("ToyFactory");
    a.setOrganizationDomain("toyfactory.com");
    
    // 设置应用程序图标
    QIcon appIcon(":/favicon.ico");
    if (appIcon.isNull()) {
        logToFile("资源中的图标加载失败");
        // 如果资源中的图标加载失败，尝试从文件系统加载
        appIcon = QIcon("favicon.ico");
    }
    
    if (!appIcon.isNull()) {
        a.setWindowIcon(appIcon);
        logToFile("应用程序图标设置成功");
    } else {
        logToFile("无法加载应用程序图标");
    }
    
    try {
        logToFile("创建主窗口对象");
        MainWindow w;
        
        logToFile("显示主窗口");
        w.show();
        
        logToFile("进入事件循环");
        
        return a.exec();
    } catch (const std::exception &e) {
        QString errorMsg = QString("程序启动时发生异常: %1").arg(e.what());
        logToFile(errorMsg);
        QMessageBox::critical(nullptr, "程序启动错误", errorMsg);
        return -1;
    } catch (...) {
        QString errorMsg = "程序启动时发生未知异常";
        logToFile(errorMsg);
        QMessageBox::critical(nullptr, "程序启动错误", errorMsg);
        return -1;
    }
}